// hooks/usePageFetch.js
import { ref, onMounted, toRaw, watch } from 'vue';
import useFetch from './useFetch';
import { ElMessage } from 'element-plus';

/**
 * 分页数据管理 Hook
 * @param {Function} fn - 请求函数
 * @param {Object} options - 配置选项
 * @param {Object} options.params - 默认参数
 * @param {boolean} options.initFetch - 是否自动初始化请求
 * @param {Ref} options.formRef - 表单引用
 */
function usePageFetch(fn, options = {}) {
  // 分页状态
  const page = ref(1); // 当前页码
  const pageSize = ref(10); // 每页条数
  const total = ref(0); // 总条数
  const data = ref([]); //当前页的数据列表
  const params = ref(); //搜索参数
  const pendingCount = ref(0); //未处理的数据计数

  // 初始化参数
  params.value = options.params;

  //  使用基础请求 Hook
  const { isFetching, fetch: fetchFn, error, data: originalData } = useFetch(fn);

  //  核心请求方法
  const fetch = async (searchParams, pageNo, size) => {
    try {
      // 更新分页状态
      page.value = pageNo;
      pageSize.value = size;
      params.value = searchParams;

      // 发起请求
      await fetchFn({
        page: pageNo,
        pageSize: size,
        // 使用 toRaw 避免响应式对象问题
        ...(searchParams ? toRaw(searchParams) : {}),
      });

      // 处理响应数据
      data.value = originalData.value?.list || [];
      total.value = originalData.value?.total || 0;
      pendingCount.value = originalData.value?.pendingCounts || 0;
    } catch (e) {
      console.error('usePageFetch error:', e);
      ElMessage.error(e?.msg || e?.message || '请求出错');
      // 清空数据，提供更好的用户体验
      data.value = [];
      total.value = 0;
    }
  };

  //  搜索 - 重置到第一页
  const search = async searchParams => {
    await fetch(searchParams, 1, pageSize.value);
  };

  // 刷新当前页
  const refresh = async () => {
    await fetch(params.value, page.value, pageSize.value);
  };

  // 改变页大小
  const onSizeChange = async size => {
    await fetch(params.value, 1, size); // 重置到第一页
  };

  // 切换页码
  const onCurrentChange = async pageNo => {
    await fetch(params.value, pageNo, pageSize.value);
  };

  // 组件挂载时自动请求
  onMounted(() => {
    if (options.initFetch !== false) {
      search(params.value);
    }
  });

  // 监听表单引用变化（可选功能）
  watch(
    () => options.formRef,
    formRef => {
      if (formRef) {
        console.log('Form ref updated:', formRef);
      }
    }
  );

  return {
    // 分页状态
    currentPage: page,
    pageSize,
    total,
    pendingCount,

    // 数据状态
    data,
    originalData,
    isFetching,
    error,

    // 操作方法
    search,
    refresh,
    onSizeChange,
    onCurrentChange,
  };
}

export default usePageFetch;
